﻿/****************************************************************************
 * Application   : Freekick Desktop Manager
 * Author        : sfreekick
 * Email         : sfreekick@gmail.com
 * Copyright     : (C) 2008 sfreekick
 * **************************************************************************/

/****************************************************************************
 *  This file is part of FreeKickManager.
 *
 *  FreeKickManager is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  FreeKickManager is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with FreeKickManager. If not, see <http://www.gnu.org/licenses/>.
 ****************************************************************************/

using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.IO;
using System.Net;

namespace FreeKickManager
{
    public partial class FrmEquipo : Form
    {
        public FrmEquipo()
        {
            InitializeComponent();

            lblMensajeProgreso.Text = "Recuperando datos del equipo...";
            pbProgreso.Step = 1;
            pbProgreso.Minimum = 0;
            pbProgreso.Value = 1;
            pbProgreso.Maximum = 5;

            bworker.RunWorkerAsync();
        }

        private void cargarDatosEquipo()
        {
            string xml = null;

            int temporadaActual = calcularTemporadaActual();

            if (FrmPrincipal.infoEquipo == null)
            {
                xml = CargadorXml.descargarXml(@"http://www.freekick.org/public/getdata.php?getdata=ownclub&datatype=xml&username=" + FrmPrincipal.opciones.obtenerOpcion("usuario") + "&password=" + FrmPrincipal.opciones.obtenerOpcion("password"));

                if (xml != null)
                {
                    FrmPrincipal.infoEquipo = CargadorXml.cargarInformacionEquipo(xml);
                }
            }

            bworker.ReportProgress(1);

            if ((xml != null) && FrmPrincipal.listaPartidos == null)
            {
                xml = CargadorXml.descargarXml("http://www.freekick.org/public/getdata.php?getdata=matches&teamid=" + FrmPrincipal.infoEquipo.idEquipo + "&type=league");

                if (xml != null)
                {
                    List<Partido> listaPartidos = CargadorXml.cargarListaPartidos(xml);

                    listaPartidos = filtrarPartidos(listaPartidos, temporadaActual);

                    FrmPrincipal.listaPartidos = listaPartidos;
                }
            }

            bworker.ReportProgress(1);

            if ((xml != null) && FrmPrincipal.clasifSenior == null)
            {
                xml = CargadorXml.descargarXml(@"http://www.freekick.org/public/getdata.php?getdata=league&datatype=xml&league=" + FrmPrincipal.infoEquipo.liga + "&division=" + FrmPrincipal.infoEquipo.divisionSenior + "&series=" + FrmPrincipal.infoEquipo.serieSenior + "&squad=senior&season=" + temporadaActual);

                FrmPrincipal.clasifSenior = CargadorXml.cargarClasificacion(xml);
            }

            bworker.ReportProgress(1);

            if ((xml != null) && FrmPrincipal.clasifJuvenil == null)
            {
                xml = CargadorXml.descargarXml(@"http://www.freekick.org/public/getdata.php?getdata=league&datatype=xml&league=" + FrmPrincipal.infoEquipo.liga + "&division=" + FrmPrincipal.infoEquipo.divisionJuvenil + "&series=" + FrmPrincipal.infoEquipo.serieJuvenil + "&squad=youth&season=" + temporadaActual);

                FrmPrincipal.clasifJuvenil = CargadorXml.cargarClasificacion(xml);
            }

            bworker.ReportProgress(1);
        }

        private void cargarListaPartidos(ListView list, List<Partido> listaPartidos, string categoria)
        {
            foreach (Partido p in listaPartidos)
            {
                if (p.categoria.Equals(categoria))
                {
                    ListViewItem li = new ListViewItem(new string[3] { 
                        p.campo.Equals("home") ? p.nombrePropio : p.nombreOponente, 
                        p.campo.Equals("home") ? p.nombreOponente : p.nombrePropio, 
                        p.resultado });

                    li.Tag = p;
                    list.Items.Add(li);
                }
            }   
        }

        private void cargarInformacionEquipo()
        {
            lblNombreEquipo.Text = FrmPrincipal.infoEquipo.nombre;
            lblEstadio.Text = FrmPrincipal.infoEquipo.estadio + " [ Aforo: " + FrmPrincipal.infoEquipo.aforo + " ]";
            lblIdEquipo.Text = FrmPrincipal.infoEquipo.idEquipo.ToString();

            lblPopularidadSenior.Text = Traductor.traducirFormaInglesFormaAbrev(FrmPrincipal.infoEquipo.popularidadSenior);
            lblEspectaculoSenior.Text = Traductor.traducirFormaInglesFormaAbrev(FrmPrincipal.infoEquipo.espectaculoSenior);
            lblDivisionSenior.Text = Traductor.traducirDivision(FrmPrincipal.infoEquipo.divisionSenior) + " (" + FrmPrincipal.infoEquipo.serieSenior + ")";
            lblRankingNacSenior.Text = FrmPrincipal.infoEquipo.rankingNacionalSenior + " / " + FrmPrincipal.infoEquipo.equiposNacionalSenior;
            lblRankingMunSenior.Text = FrmPrincipal.infoEquipo.rankingMundialSenior + " / " + FrmPrincipal.infoEquipo.equiposMundialSenior;

            lblPopularidadJuvenil.Text = Traductor.traducirFormaInglesFormaAbrev(FrmPrincipal.infoEquipo.popularidadJuvenil);
            lblEspectaculoJuvenil.Text = Traductor.traducirFormaInglesFormaAbrev(FrmPrincipal.infoEquipo.espectaculoJuvenil);
            lblDivisionJuvenil.Text = Traductor.traducirDivision(FrmPrincipal.infoEquipo.divisionJuvenil) + " (" + FrmPrincipal.infoEquipo.serieJuvenil + ")";
            lblRankingNacJuvenil.Text = FrmPrincipal.infoEquipo.rankingNacionalJuvenil + " / " + FrmPrincipal.infoEquipo.equiposNacionalJuvenil;
            lblRankingMunJuvenil.Text = FrmPrincipal.infoEquipo.rankingMundialJuvenil + " / " + FrmPrincipal.infoEquipo.equiposMundialJuvenil;
        }

        private int calcularTemporadaActual()
        {
            DateTime fechaReferencia = new DateTime(2008, 1, 21);
            int temporadaReferencia = 16;

            DateTime hoy = DateTime.Now;

            DateTime fechaSiguienteTemporada = fechaReferencia.AddDays(98);
            int siguienteTemporada = temporadaReferencia + 1;

            while (fechaSiguienteTemporada < hoy)
            {
                fechaSiguienteTemporada = fechaSiguienteTemporada.AddDays(98);
                siguienteTemporada++;
            }

            return (siguienteTemporada-1);
        }

        private List<Partido> filtrarPartidos(List<Partido> listaPartidos, int temporada)
        {
            List<Partido> lista = new List<Partido>();

            foreach (Partido part in listaPartidos)
            {
                if(part.temporada.Equals(temporada.ToString()))
                {
                    lista.Add(part);
                }
            }

            return lista;
        }

        private void bworker_DoWork(object sender, DoWorkEventArgs e)
        {
            cargarDatosEquipo();
        }

        private void bworker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            pbProgreso.PerformStep();
        }

        private void bworker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if(FrmPrincipal.infoEquipo != null)
                cargarInformacionEquipo();

            if (FrmPrincipal.listaPartidos != null)
            {
                cargarListaPartidos(lstPartidosSenior, FrmPrincipal.listaPartidos, "senior");
                cargarListaPartidos(lstPartidosJuvenil, FrmPrincipal.listaPartidos, "youth");
            }

            if (FrmPrincipal.clasifSenior != null)
            {
                for (int i = 0; i < FrmPrincipal.clasifSenior.Count; i++)
                {
                    Equipo eq = (Equipo)FrmPrincipal.clasifSenior[i];

                    ListViewItem li = new ListViewItem(new string[4] { (i + 1).ToString(), eq.nombre, eq.puntos.ToString(), (eq.golesFavor - eq.golesContra).ToString() });
                    li.Tag = eq;
                    lstClasificacionSenior.Items.Add(li);
                }
            }

            if (FrmPrincipal.clasifJuvenil != null)
            {
                for (int i = 0; i < FrmPrincipal.clasifJuvenil.Count; i++)
                {
                    Equipo eq = (Equipo)FrmPrincipal.clasifJuvenil[i];

                    ListViewItem li = new ListViewItem(new string[4] { (i + 1).ToString(), eq.nombre, eq.puntos.ToString(), (eq.golesFavor - eq.golesContra).ToString() });
                    li.Tag = eq;
                    lstClasificacionJuvenil.Items.Add(li);
                }
            }

            lblMensajeProgreso.Text = "Recuperación de datos finalizada.";
        }

        private void lstPartidosSenior_DoubleClick(object sender, EventArgs e)
        {
            Partido p = (Partido)lstPartidosSenior.SelectedItems[0].Tag;

            if (!p.resultado.Equals(""))
            {
                FrmVisorPartidos frm = new FrmVisorPartidos(p);
                frm.Show();
            }
            else
            {
                FrmAlineacion frm = new FrmAlineacion(TipoListaJugadores.SENIOR);
                frm.MdiParent = (FrmPrincipal)this.Parent;
                frm.Show();
            }
        }

        private void lstPartidosJuvenil_DoubleClick(object sender, EventArgs e)
        {
            Partido p = (Partido)lstPartidosJuvenil.SelectedItems[0].Tag;

            if (!p.resultado.Equals(""))
            {
                FrmVisorPartidos frm = new FrmVisorPartidos(p);
                frm.Show();
            }
            else
            {
                FrmAlineacion frm = new FrmAlineacion(TipoListaJugadores.JUNIOR);
                frm.MdiParent = (FrmPrincipal)this.Parent;
                frm.Show();
            }
        }

        private void lblDivisionSenior_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            tabControl1.SelectedIndex = 1;
        }

        private void lblDivisionJuvenil_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
        {
            tabControl1.SelectedIndex = 2;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            FrmVisorPartidos frm = new FrmVisorPartidos("senior");
            frm.MdiParent = this.Owner;
            frm.Show();

            this.Close();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            FrmVisorPartidos frm = new FrmVisorPartidos("youth");
            frm.MdiParent = this.Owner;
            frm.Show();

            this.Close();
        }
    }
}
